game.verbs = {};
parser.events = {};
undefined = "Хм... Не представляю, как это?";

local oldverb = Verb;
Verb = function(tab)
  local vn = tab[2]
  tab[2] = function(s)
    local vb = trim_verb(tab[1]);
    for _,v in ipairs(objs()) do
      for k,_ in pairs(v) do
        if k == vb then
          return rcall(vn,s);
        end
      end
    end
    for _,v in ipairs(inv()) do
      for k,_ in pairs(v) do
        if k == vb then
          return rcall(vn,s);
        end
      end
    end
    for k,_ in pairs(here()) do
      if k == vb then
        return rcall(vn,s);
      end
    end
  end
  return oldverb(tab);
end

articles = {
   ["Look"] = { ["под"] = "тв" }
  ,["Lie"] = {}
  ,["Sit"] = {}
  ,["Stand"] = { ["на"] = "вн", ["с"] = "рд", ["справа от"] = "рд", ["слева от"] = "рд" }
  ,["Walk"] = { ["по"] = "дт", ["к"] = "дт", ["в"] = "вн", ["на"] = "вн" }
  ,["Throw"] = {}
  ,["Talk"] = {}
  ,["Fetch"] = { ["в"] = "вн" }
  ,["TurnOn"] = {}
  ,["TurnOff"] = { ["от"] = "рд" }
  ,["Hide"] = { ["от"] = "рд" }
  ,["Reply"] = { ["на"] = "вн" }
  ,["Recall"] = { ["о"] = "пр" }
  ,["Search"] = { ["на"] = "пр", ["в"] = "пр", ["у"] = "рд" }
  ,["Ascend"] = { ["с"] = "рд" }
  ,["Exit"] = { ["в"] = "вн" }
  ,["TakeOff"] = { ["с"] = "рд", ["со"] = "рд" }
  ,["TearOff"] = { ["с"] = "рд", ["со"] = "рд" }
  ,["Call"] = { ["по"] = "дт" }
  ,["Write"] = { ["в"] = "пр" }
  ,["Descend"] = { ["к"] = "дт", ["в"] = "вн", ["на"] = "вн" }
}

--Refresh
Verb { "Refresh", "~осмотреться", "{}" }

--Cry
Verb { "Cry", "~кричать|~вскрикнуть|~закричать|~крикнуть", "{}" }

--Return
function verb_return(s)
  if here().Return ~= nil then
    return "~вернуться";
  end
end
Verb { "Return", verb_return, "{}" }

--Exit
Verb { "Exit %2", "~выйти|~уйти", verb_with_obj_("рд",nil,"{}") }
parser.events.Exit = function()
  return "Отсюда невозможно выйти.";
end;

--Exam
Verb { "Exam %2", "~осмотреть|~изучить|~исследовать|~рассмотреть", verb_with_obj_inv_("вн", nil, "{hero}вн") }
Verb { "Look %2", "~смотреть|~посмотреть", verb_with_obj_inv_("вн", nil, "{hero}вн") }

--Walk
Verb { "Walk %2", "~идти|~пойти", verb_with_obj_("вн") }

--Wait
Verb { "Wait", "~ждать|~ожидать|~подождать", "{}" }
parser.events.Wait = function()
  return "Какое-то время я просто прислушиваюсь к тяжёлой давящей тишине вокруг себя. Кажется, я даже начинаю слышать биение собственного сердца.";
end

--Take
Verb { "Take %2", "~взять|~забрать|~поднять|~подобрать", verb_with_obj_("вн") }
parser.events.Close = function(self,w)
  return "Думаю, лучше оставить " .. w:M("вн") .. " в покое.";
end

--Choose
Verb { "Choose %2", "~выбрать", verb_with_obj_("вн") }

--Insert
Verb { "Insert %2 %3", "~вставить", verb_with_inv_("вн"), aux_with_obj_("вн") }

--Open
Verb { "Open %2 %3", "~открыть", verb_with_obj_inv_("вн"), aux_with_inv_("тв",nil,"{}") }
parser.events.Open = function(self,w)
  return "Не представляю, как можно открыть " .. w:M("вн") .. ".";
end

--Close
Verb { "Close %2 %3", "~закрыть", verb_with_obj_inv_("вн"), aux_with_inv_("тв",nil,"{}") }
parser.events.Close = function(self,w)
  return "Я не очень понимаю, как " .. w:M("вн") .. " можно закрыть.";
end

--Sit
Verb { "Sit %2", "~сесть|~присесть", verb_with_obj_("вн") }
parser.events.Sit = function(self,w)
  if w.kind_ == "bed" or w.kind_ == "chair" or w.kind_ == "table" then
    return "Я бы предпочёл постоять на ногах.";
  else
    return "Мне бы не хотелось садиться " .. w:M("вн") .. ".";
  end
end

--Lie
Verb { "Lie %2", "~лечь|~прилечь", verb_with_obj_("вн") }
parser.events.Lie = function(self,w)
  return "Как-то у меня нет желания лежать " .. w:M("пр") .. ".";
end

--Stand
Verb { "Stand %2", "~встать", verb_with_obj_("рд",nil,"{}") }
parser.events.Stand = function(self,w)
  local hw = here();
  if hw.Stand ~= nil then
    return rcall(hw.Stand, hw);
  else
    return "Я и так стою на ногах.";
  end
end

--Throw
Verb { "Throw %2 %3", "~бросить|~кинуть", verb_with_inv_("вн"), aux_with_obj_("вн", nil, "{}") }
parser.events.Throw = function(self,w)
  return "Думаю, что " .. w:M("вн") .. " мне еще может пригодиться.";
end

--Put
Verb { "Put %2 %3", "~положить|~поставить|~ставить|~класть", verb_with_inv_("вн"), aux_with_obj_("вн") }
parser.events.Put = function(self,w,t)
  return "Положить " .. w:M("тв") .. " на " .. t:M("вн") .. " никак не получится.";
end

--Move
Verb { "Move %2", "~передвинуть|~двигать|~сдвинуть|~пододвинуть|~отодвинуть", verb_with_obj_inv_("вн") }
parser.events.Move = function(self,w)
  return "Сомневаюсь, что у меня получится сдвинуть " .. w:M("вн") .. " хоть на миллиметр.";
end

--Talk
Verb { "Talk %2", "~говорить|~поговорить|~заговорить|~разговаривать", verb_with_obj_("тв") }

--Listen
Verb { "ListenTo %2", "~прислушаться", verb_with_obj_("дт") }
Verb { "Listen %2", "~слушать", verb_with_obj_("вн") }

--Drink
Verb { "Drink %2", "~пить|~выпить", verb_with_inv_("вн") }

--Wreck
Verb { "Wreck %2 %3", "~сломать|~разломать|~ломать|~выломать|~разбить", verb_with_obj_inv_("вн"), aux_with_inv_("тв", nil, "{}") }
parser.events.Wreck = function(self,w)
  if w.break_ then
    return "Не стоит этого делать.";
  else
    return "Сомневаюсь, что у меня что-нибудь получится.";
  end
end

--Ascend
Verb { "Ascend %2", "~подняться|~залезть|~лезть|~забраться", verb_with_obj_("вн") }
parser.events.Ascend = function(self,w,t,z)
  if w.kind_ == "chair" then
    return redirect(w,t,z,"Sit");
  elseif w.kind_ == "bed" then
    return redirect(w,t,z,"Lie");
  elseif w.kind_ == "floor" then
    return redirect(w,t,z,"Lie");
  elseif w.kind_ == "table" then
    return "Не думаю, что забираться на стол -- это хорошая идея.";
  elseif w.kind_ == "ceil" then
    return "Сомневаюсь, что у меня получится забраться на потолок. Да и зачем это делать?";
  else
    return "Ну и зачем мне залезать "..w:M("вн").."?";
  end
end

--Descend
Verb { "Descend %2", "~спуститься|~слезть", verb_with_obj_("рд",nil,"{}") }
parser.events.Descend = function(self,w,t,z)
  if w and (w.kind_ == "chair" or w.kind_ == "bed") then
    return redirect(w,t,z,"Stand");
  else
    return "Спуститься отсюда не получится.";
  end
end

--Pure
Verb { "Pure %2 %3", "~лить|~вылить|~налить|~пролить", verb_with_inv_("вн"), aux_with_obj_("вн") }
parser.events.Pure = function(self,w,t)
  if w.kind_ == "human" then
    return "Как-то у меня нет желания обливать людей.";
  else
    return "Нет никакого смысла в том, чтобы выливать "..w:M("вн").." "..t:M("вн")..".";
  end
end

--Attack
Verb { "Attack %2", "~атаковать", verb_with_obj_inv_("вн") }
parser.events.Attack = function(self,w,t)
  return "Не стоит это делать.";
end
Verb { "Pounce %2", "~наброситься|~броситься|~накинуться|~кинуться|~напасть", verb_with_obj_inv_("вн") }
Verb { "Kick %2 %3", "~ударить|~бить", verb_with_obj_inv_("вн"), aux_with_inv_("тв",nil,"{}") }

--TurnAround
Verb { "TurnAround", "~обернуться|~оглянуться", "{}" }

--Give, Fetch
Verb { "Give %2 %3", "~дать|~отдать|~передать", verb_with_inv_("вн"), aux_with_obj_("дт") }
Verb { "Fetch %2 %3", "~вернуть", verb_with_inv_("вн"), aux_with_obj_("дт") }

--TakeOff
Verb { "TakeOff %2 %3", "~снять", verb_with_obj_("вн"), aux_with_obj_inv_("тв",nil,"{}") }

--Wear
Verb { "Wear %2", "~надеть", verb_with_obj_("вн") }

--Spin
Verb { "Spin %2", "~повернуть", verb_with_obj_inv_("вн") }
parser.events.Spin = function(self,w,t,z)
  return redirect(w,t,z,"Move");
end

--Activate
Verb { "Activate %2", "~активировать", verb_with_obj_inv_("вн") }
parser.events.Activate = function(self,w,t,z)
  return redirect(w,t,z,"TurnOn");
end

--Stir
Verb { "Stir %2", "~шевелить|~пошевелить", verb_with_obj_inv_("тв") }

--Think
Verb { "Think %2", "~думать|~подумать", verb_with_obj_inv_("пр") }

--Recall
Verb { "Recall %2", "~вспомнить", verb_with_obj_inv_("вн") }

--Photo
Verb { "Photo %2 %3", "~фотографировать|~сфотографировать", verb_with_obj_("вн"), aux_with_obj_inv_("вн") }
Verb { "Film %2 %3", "~снять|~снимать", verb_with_obj_("вн"), aux_with_obj_inv_("вн") }

--EndSimulation
Verb { "EndSimulation", "~вернись", "{}" }

--Read
Verb { "Read %2", "~читать|~прочитать", verb_with_obj_inv_("вн") }

--Reply
Verb { "Reply %2", "~ответить", verb_with_obj_inv_("дт") }

--Write
Verb { "Write %2", "~писать|~написать", verb_with_obj_inv_("вн") }

--TurnOn
Verb { "TurnOn %2 %3", "~включить|~подключить|~присоединить|~подсоединить", verb_with_obj_inv_("вн"), aux_with_obj_inv_("дт",nil,"{}") }
parser.events.TurnOn = function(self,w,t)
  return "Вообще-то "..w:M("им").." и так работает.";
end

--TurnOff
Verb { "TurnOff %2 %3", "~отключить|~выключить|~отсоединить", verb_with_obj_inv_("вн"), aux_with_obj_inv_("рд",nil,"{}") }
parser.events.TurnOff = function(self,w,t)
  return "Я внимательно осматриваю " .. w:M("вн").. ", но не нахожу выключателя.";
end

--Call
Verb { "Call %2", "~позвонить|~звонить", verb_with_obj_inv_("дт") }

--Request
Verb { "Request %2", "~вызвать", verb_with_obj_inv_("вн") }

--Press
Verb { "Press %2", "~нажать", verb_with_obj_inv_("вн") }

--Enter
Verb { "Enter %2", "~зайти|~войти", verb_with_obj_inv_("вн") }

--Search
Verb { "Search %2", "~искать", verb_with_obj_inv_("тв") }

--PutAway, PutIn
Verb { "PutAway %2 %3", "~убрать", verb_with_inv_("вн"), aux_with_obj_("вн") }
Verb { "PutIn %2 %3", "~засунуть|~втолкнуть", verb_with_inv_("вн"), aux_with_obj_("вн") }

--TakeFrom
Verb { "TakeFrom %2 %3 %4", "~достать|~извлечь|~вынуть|~вытащить", verb_with_obj_inv_("вн"), aux_with_obj_inv_("рд",nil,"{}"), aux2_with_obj_inv_("тв",nil,"{}") }

--Cut
Verb { "Cut %2 %3", "~резать|~разрезать", verb_with_obj_inv_("вн"), aux_with_obj_inv_("тв") }

--Bant
Verb { "Bant %2 %3", "~перевязать|~перебинтовать|~бинтовать", verb_with_obj_inv_("вн"), aux_with_obj_inv_("тв") }

--Sleep
Verb { "Sleep", "~спать|~уснуть|~заснуть", "{}" }

--Tear
Verb { "Tear %2 %3", "~оторвать|~порвать|~разорвать|~рвать", verb_with_obj_inv_("вн"), aux_with_inv_("тв", nil, "{}") }
Verb { "TearOff %2 %3", "~сорвать", verb_with_obj_inv_("вн"), aux_with_obj_inv_("рд", nil, "{}") }

--Plug
Verb { "Plug %2", "~подключиться", verb_with_obj_("дт") }

--Reboot
Verb { "Reboot %2", "~перезагрузить", verb_with_obj_("вн") }

--Hide
Verb { "Hide %2", "~спрятаться|~прятаться|~укрыться", verb_with_obj_("вн") }

--Shoot
Verb { "Shoot %2 %3", "~выстрелить|~стрелять", verb_with_inv_("рд"), aux_with_obj_("вн") }

--Use
Verb { "Use %2", "~использовать|~пользовать", verb_with_obj_("вн") }

--Crack
Verb { "Crack %2 %3", "~взломать|~вскрыть", verb_with_obj_inv_("вн"), aux_with_inv_("тв",nil,"{}") }

--Approach
Verb { "Approach %2", "~подойти", verb_with_obj_("дт") }

--Invent
Verb { "Invent %2", "~придумать", verb_with_obj_("вн") }

--Spy
Verb { "Spy %2", "~подслушать", verb_with_obj_("вн") }

--Draw
Verb { "Draw %2 %3", "~протянуть|~тянуть", verb_with_obj_inv_("вн"), aux_with_obj_("дт") }

--Threat
Verb { "Threat %2 %3", "~угрожать|~грозить", verb_with_obj_("дт"), aux_with_inv_("тв", nil, "{}") }

--WalkAround
Verb { "WalkAround %2", "~пройтись|~прогуляться|~гулять", verb_with_obj_("дт") }

--Check
Verb { "Check %2", "~проверить", verb_with_obj_inv_("вн") }

--TakeForce
Verb { "TakeForce %2 %3", "~отобрать|~вырвать|~выхватить", verb_with_obj_inv_("вн"), aux_with_obj_("рд") }
